如何解决 Netty Channel.isWritable 返回 false

您所在的位置:网站首页 netty channel write 如何解决 Netty Channel.isWritable 返回 false

如何解决 Netty Channel.isWritable 返回 false

2024-07-14 20:51:31| 来源: 网络整理| 查看: 265

在 Netty 里,有4个方法用来查询 Channel 的状态:isOpen,isRegistered,isActive,isWritable,其中,isWritable 在并发量很高时会返回很多 false。

isWritable 是什么含义?

isWritable:Returns true if and only if the I/O thread will perform the requested write operation immediately. Any write requests made when this method returns false are queued until the I/O thread is ready to process the queued write requests.

为什么 isWritable 会返回 false?而且这个问题在 stackoverflow,netty 社区也被很多人问到。

i.e.

if (channel.isWritable()) { channel.writeAndFlush(data); }

 

首先,说下 netty 处理 writeAndFlush 的原理:

1、业务线程调用 writeAndFlush 发送消息,会生成 WriteAndFlushTask,交由 IO 线程处理,write 操作将消息写入 ChannelOutboundBuffer(不会写到 socket),flush 操作将 ChannelOutboundBuffer 写 入socket 的发送缓冲区;(这里注意,writeAndFlush 它只是一个语法糖,意味着这不是原子操作,因此在此方法执行的中间,可能在多个线程之间进行了上下文切换。)

2、ChannelOutboundBuffer 它配置一个高水位线和低水位线,当 buffer 的大小超过高水位线的时候对应 channel 的 isWritable 就会变成 false,当 buffer 的大小低于低水位线的时候,isWritable 就会变成 true。

其中,高水位线和低水位线是字节数,默认高水位是64K,低水位是32K,通过以下方式进行设置:

.option(ChannelOption.WRITE_BUFFER_HIGH_WATER_MARK, 64 * 1024) .option(ChannelOption.WRITE_BUFFER_LOW_WATER_MARK, 32 * 1024)

 

如何解决这个问题?

ChannelOutboundBuffer 的容量过高或过低时都会触发 fireChannelWritabilityChanged 方法,因此可通过重写 channelWritabilityChanged 方法调整消息产生速度。

在常用的中间件里,我们看看它们是如何处理的:

1、Notify 在给订阅组投递消息时,先检查此订阅组的 Channel 是否超过最高位,如果是,则此次不投递,如果不是,继续投递。

2、Flink 核心发送方法中如果 Channel 不可写,则会跳过发送,当 Channel 再次可写后,Netty 会调用该 Handle 的 ChannelWritabilityChanged 方法,从而重新触发发送函数。

3、Duboo 发送请求时,判断是否已经关闭的 Channel,如果是,不再放入连接池,重新申请连接。

总之,在使用 Channel 写数据之前,建议使用 isWritable 方法来判断一下当前 ChannelOutboundBuffer 里的写缓存水位,防止 OOM 发生。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭